package composite.source;

import java.util.ArrayList;
import java.util.List;

/**
 * 枝节点，存储子部件
 * 反复利用Composite节点就可以实现树状结构
 *
 * 透明模式与安全模式：
 * 在Component中声明所有用来管理子对象的办法，包括add与remove
 * 这样所有实现Component的子类都具备该方法。这样做的好处是叶节点跟枝节点对于外界没有任何区别
 * 具备完全一致的行为接口，但是叶节点本身不具备add与remove功能，实现其实没有意义
 *
 * 安全模式是指在Component中不声明add与remove方法。而是在Composite中才增加相关方法
 * 叶节点就不需要实现相关方法。但如此枝节点与叶节点具有不同的接口，客户端的调用需要做相应的判断
 *
 *
 *
 * @author Chen Guang
 * @date 2019/4/18 0018 上午 9:32
 */
public class Composite extends Component{

    /**
     * 保存子节点
     */
    private List<Component> children = new ArrayList<>();

    public Composite(String name) {
        super(name);
    }

    @Override
    public void add(Component c) {
        children.add(c);
    }

    @Override
    public void remove(Component c) {
        children.remove(c);
    }

    @Override
    public void display(int depth) {
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            str.append("-");
        }
        str.append(super.getName());
        System.out.println(str);
        for(Component component : children){
            component.display(depth + 2);
        }
    }
}
